{-# OPTIONS -XTypeOperators #-}

module PixObject ( PixObject(..) ) where

import              FTable ( toList2, quad )
import          Instrument ( Instrument(..) )
import      Instrument.PSF ( PSF, PointSource(..) )
import ObsObject.CRayTrace ( Trace(..) )
import      ObsObject.Star ( Star(..) )

-- представление пикселя

type Pixel = ((Int,Int), Double)

-- Определение класса объектов, которые могут быть представлены в пиксельном виде.

class PixObject obj where
   pixelization :: Instrument -> obj -> [Pixel]

--------------------------------------------------------------------------------------------------

instance PixObject Trace where
   pixelization _ (Trace (x,y) (x',y') fi ) =  [((round x, round y),200 * k) | i<-[0..n], x<-[x + i*dx], y<-[y + i*dy]]
      where
        dx = (x'-x)/n
        dy = (y'-y)/n
        n  = 5 * sqrt $ (x-x')**2 + (y-y')**2
        k  = 1 / sin fi

--------------------------------------------------------------------------------------------------

instance PixObject PointSource where
   pixelization ins (PointSource sed (u,v)) = ps
      where
         -- получаем ФРТ и спектральную чувствительность инструмента
         psf = getPSF         ins
         sen = getSensitivity ins

         o = fmap (fromRational.toRational) (sen * sed)

         ps = toList2 $ quad $ o * psf (u,v)
 
--------------------------------------------------------------------------------------------------

instance PixObject Star where
   pixelization ins (Star ps) = pixelization ins ps
